'''
    这里只列了些实用的, 像显式等待、cookie、弹窗处理、页面处理等参见gitbook的3.2 Selenium和PhantomJs

'''


from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver import ActionChains
from selenium.webdriver.support.ui import Select
import time

# webdriver对象
drv = webdriver.PhantomJS()

# 如果没有在环境变量指定PhantomJS位置
# driver = webdriver.PhantomJS(executable_path="./phantomjs"))

# 设置为隐式等待4s
drv.implicitly_wait(4)

# get方法会一直等到页面被完全加载(不包含ajax)，然后才会继续程序, 通常测试会在这里选择 time.sleep(2)
drv.get('http://www.baidu.com')
time.sleep(3)

# id='wrapper'的文本, 操作基本和js_dom类似
data = drv.find_element_by_id("wrapper").text

# 截屏当前页面
drv.save_screenshot('baidu.png')

# id='su'为百度搜索按钮, 模拟点击
drv.find_element_by_id('su').click()

# 当前页面的源代码
page_code = drv.page_source

# 当前页面的url
page_url = drv.current_url

# 获取当前页面的cookies
page_cookies = drv.get_cookies()

# 模拟键盘---> ctrl+a, ctrl+x, 输入'shuo', Enter
# id='kw'--->百度输入框  id='su'--->百度搜索按钮
drv.find_element_by_id('kw').send_keys(Keys.CONTROL,'a')
drv.find_element_by_id('kw').send_keys(Keys.CONTROL,'x')
drv.find_element_by_id('kw').send_keys('shuo')
drv.find_element_by_id('su').send_keys(Keys.RETURN)

# 清除输入框内容
drv.find_element_by_id('kw').clear()

# 前进后退
drv.forward()
drv.back()

# 特殊的鼠标动作: 移动 单击 双击 右击 按住 拖拽
ac = drv.find_element_by_xpath('element')
ActionChains(drv).move_to_element(ac).perform()                     # 移动到ac元素上
ActionChains(drv).move_to_element(ac).click(ac).perform()           # 移动并单击
ActionChains(drv).move_to_element(ac).double_click(ac).perform()    # 移动并双击
ActionChains(drv).move_to_element(ac).context_click(ac).perform()   # 移动并右击
ActionChains(drv).move_to_element(ac).click_and_hold(ac).perform()  # 移动并按住左键
ac1 = drv.find_element_by_xpath('elementD')
ac2 = drv.find_element_by_xpath('elementE')
ActionChains(drv).drag_and_drop(ac1, ac2).perform()                 # 将ac1拖拽到ac2的位置


# 元素的几种匹配方式
element1 = drv.find_element_by_id("passwd-id")    # 获取id标签值
element2 = drv.find_element_by_name("user-name")  # 获取name标签值
element3 = drv.find_elements_by_tag_name("input") # 获取标签名值
element4 = drv.find_element_by_xpath("//input[@id='passwd-id']") # 通过XPath来匹配
'''
Api:
    find_element_by_id
    find_elements_by_name
    find_elements_by_xpath
    find_elements_by_link_text
    find_elements_by_partial_link_text
    find_elements_by_tag_name
    find_elements_by_class_name
    find_elements_by_css_selector

Details to see gitbook...
'''

# 处理表单的下拉框<select>
select = Select(drv.find_element_by_name('status'))
select.select_by_index(0)                           # 选择下拉框第1个选项
select.select_by_value("0")                         # 选择<option value='0'>的选项
select.select_by_visible_text("未审核")             # 选择<option value="0">未审核</option>的选项
select.deselect_all()                               # 全部取消, 均不选

# 执行JavaScript脚本
js_code = r'var q=document.getElementById("kw");q.style.border="2px solid red";'
drv.execute_script(js_code)

# 关闭浏览器
drv.quit()
